package com.galen.manual.service;

import com.galen.manual.entity.FileRecord;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 文件记录服务接口
 */
public interface FileRecordService {

    /**
     * 异步保存文件记录
     * @param fileRecord 文件记录
     */
    void saveFileRecordAsync(FileRecord fileRecord);

    /**
     * 创建文件记录
     * @param file 上传的文件
     * @param objectName Minio对象名称
     * @param fileUrl 文件访问URL
     * @param fileCategory 文件分类
     * @param businessId 业务关联ID（可选）
     * @param businessType 业务类型（可选）
     * @param request HTTP请求对象
     * @return 文件记录
     */
    FileRecord createFileRecord(MultipartFile file, String objectName, String fileUrl,
                               String fileCategory, Long businessId, String businessType,
                               HttpServletRequest request);

    /**
     * 更新文件上传状态
     * @param id 文件记录ID
     * @param status 状态
     * @param errorMessage 错误信息（可选）
     */
    void updateFileStatus(Long id, Integer status, String errorMessage);

    /**
     * 根据ID获取文件记录
     * @param id 文件记录ID
     * @return 文件记录
     */
    FileRecord getFileRecordById(Long id);

    /**
     * 根据对象名称获取文件记录
     * @param objectName 对象名称
     * @return 文件记录
     */
    FileRecord getFileRecordByObjectName(String objectName);

    /**
     * 根据业务关联获取文件列表
     * @param businessId 业务ID
     * @param businessType 业务类型
     * @return 文件记录列表
     */
    List<FileRecord> getFileRecordsByBusiness(Long businessId, String businessType);

    /**
     * 根据用户ID获取文件列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 文件记录列表
     */
    List<FileRecord> getFileRecordsByUserId(Long userId, Integer limit);

    /**
     * 根据分类获取文件列表
     * @param fileCategory 文件分类
     * @param limit 限制数量
     * @return 文件记录列表
     */
    List<FileRecord> getFileRecordsByCategory(String fileCategory, Integer limit);

    /**
     * 更新下载次数
     * @param id 文件记录ID
     */
    void updateDownloadCount(Long id);

    /**
     * 删除文件记录（逻辑删除）
     * @param id 文件记录ID
     */
    void deleteFileRecord(Long id);

    /**
     * 批量删除文件记录（逻辑删除）
     * @param ids 文件记录ID列表
     */
    void deleteFileRecords(List<Long> ids);

    /**
     * 检查文件是否重复（基于哈希值）
     * @param fileHash 文件哈希值
     * @return 是否重复
     */
    boolean isFileDuplicate(String fileHash);

    /**
     * 获取文件统计信息
     * @param fileCategory 文件分类（可选）
     * @return 统计信息Map
     */
    java.util.Map<String, Object> getFileStatistics(String fileCategory);

    /**
     * 清理过期文件记录
     * @return 清理的文件数量
     */
    int cleanExpiredFiles();
}